package c04.biasedlock;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

import java.util.concurrent.TimeUnit;

/*
偏向锁默认是延迟生效的，程序启动时不会立即生效，如果想避免延迟，可以加VM参数禁用延迟：
-XX:BiasedLockingStartupDelay=0

偏向锁适用于很少发生竞态条件的情况，对于确定一般情况下都会发生竞态条件的应用场景，可以禁用偏向锁
-XX:-UseBiasedLocking
 */
@Slf4j(topic = "c.BiasedLock")
public class BiasedLock {
    static class Dog {

    }

    public static void main(String[] args) throws InterruptedException {
        Dog dog = new Dog();
        // 测试延迟特性
//        log.debug("调用hashCode(): {}", Integer.toHexString(dog.hashCode())); // 1、会撤消对象的偏向锁
        log.debug("程序启动时: {}", ClassLayout.parseInstance(dog).toPrintable());
        TimeUnit.SECONDS.sleep(2);
        log.debug("延时2秒后: {}", ClassLayout.parseInstance(dog).toPrintable());

        synchronized (dog) {
            // 测试加轻量锁
            log.debug("加锁后: {}", ClassLayout.parseInstance(dog).toPrintable());
        }

        // 测试无锁状态
        log.debug("释放锁后：{}", ClassLayout.parseInstance(dog).toPrintable());
    }
}

